package com.sheng.leetcode.year2023.month12.day18;

import org.junit.Test;

/**
 * @author by ls
 * @date 2023/12/19
 * <p>
 * 162. 寻找峰值<p>
 * <p>
 * 峰值元素是指其值严格大于左右相邻值的元素。<p>
 * 给你一个整数数组 nums，找到峰值元素并返回其索引。数组可能包含多个峰值，在这种情况下，返回 任何一个峰值 所在位置即可。<p>
 * 你可以假设 nums[-1] = nums[n] = -∞ 。<p>
 * 你必须实现时间复杂度为 O(log n) 的算法来解决此问题。<p>
 * <p>
 * 示例 1：<p>
 * 输入：nums = [1,2,3,1]<p>
 * 输出：2<p>
 * 解释：3 是峰值元素，你的函数应该返回其索引 2。<p>
 * <p>
 * 示例 2：<p>
 * 输入：nums = [1,2,1,3,5,6,4]<p>
 * 输出：1 或 5<p>
 * 解释：你的函数可以返回索引 1，其峰值元素为 2；<p>
 * 或者返回索引 5， 其峰值元素为 6。<p>
 * <p>
 * 提示：<p>
 * 1 <= nums.length <= 1000<p>
 * -2^31 <= nums[i] <= 2^31 - 1<p>
 * 对于所有有效的 i 都有 nums[i] != nums[i + 1]<p>
 */
public class LeetCode0162 {

    @Test
    public void test01() {
//        int[] nums = {1, 2, 3, 1};
        int[] nums = {1, 2, 1, 3, 5, 6, 4};
//        int[] nums = {1};
        System.out.println(new Solution().findPeakElement(nums));
    }
}

class Solution {
    public int findPeakElement(int[] nums) {
        // 找到一个元素，要求其大于左右元素
        int n = nums.length;
        int i = 0;
        while (i < n) {
            if (i != 0) {
                // 获取到满足当前值大于前一个元素的索引位置
                while (i < n && nums[i] <= nums[i - 1]) {
                    i++;
                }
            }
            if (i == n - 1) {
                return i;
            } else {
                // 判断是否大于后一位元素
                if (nums[i] > nums[i + 1]) {
                    return i;
                }
            }
            i++;
        }
        return -1;
    }
}
